#include "sysdefs.h"

int main(int argc, char* argv[]) {

	FILE* processFile;
	char fileName[50];

	char programName[50];
	char programArgs[10][50];
	int execHours;
	int execMinutes;
	int execSeconds;
	int argCount;
	int numProc;
	int idFilaEnvio;
	int idFilaRecebimento;

	procInfo proc;
	intMsg schedulerReply;

	int i;
	int j;

	i = 0;

	/*Obtem a fila*/
	if ((idFilaEnvio = msgget(CHAVE_FILA_SUBMIT_SCHEDULE, 0x1FF)) < 0) {
		printf("SO_Submit: Erro ao tentar obter a fila de mensagem!\n");
		exit(1);
	}

	if ((idFilaRecebimento = msgget(CHAVE_FILA_SCHEDULE_SUBMIT, 0x1FF)) < 0) {
		printf("SO_Submit: Erro ao tentar obter a fila de mensagem!\n");
		exit(1);
	}

	/*Programa exige apenas um parametro*/
	if (argc != 2) {
		printf("ERRO! Numero de argumentos diferente do esperado\n\nUso esperado: so_submit <nome_arquivo>\n");
		exit(1);
	}

	strcpy(fileName, argv[1]);
	if ((processFile = fopen(fileName, "r")) == NULL) {
		printf("Nao consegui abrir o arquivo %s.\n", fileName);
		exit(1);
	}

	/*O nome do programa e lido*/
	fscanf(processFile, "Program = %s", programName);

	while (getc(processFile) != '\n') {
		fscanf (processFile, "%s", programArgs[i]);
		i++;
	}
	argCount = i + 1;

	fscanf(processFile, "Max_Time = %d:%d:%d\n", &execHours, &execMinutes, &execSeconds);

	fscanf(processFile, "N_proc = %d", &numProc);

	/*Copiando os atributos lidos para a struct*/
	proc.nReq = 0; /*Numero da requisicao, a ser preenchido pelo schedule*/
	proc.dummyLong = getpid(); /*Campo a ser preenchido pelo schedule tambem*/
	proc.startTime = 0; /*Idem*/
	strcpy(proc.programName, programName);
	strcpy(proc.programArgs[0], programName);
	for(j = 1; j < argCount; j++) {
		strcpy(proc.programArgs[j], programArgs[j - 1]);
	}
	for(;j<10;j++){
		strcpy(proc.programArgs[j],"\0");
	}
	proc.numProc = numProc;
	proc.execSeconds = (execHours * 3600) + (execMinutes * 60) + execSeconds;
	proc.state = PENDING;
	proc.argCount = argCount;
	/****/

	if (msgsnd(idFilaEnvio, &proc, sizeof(procInfo)-sizeof(long), 0) < 0) {
		printf("SO_Submit: Erro ao tentar enviar informacao do processo para schedule!\n");
		exit(1);
	}

	if (msgrcv(idFilaRecebimento, &schedulerReply, sizeof(intMsg)-sizeof(long), 0, 0) < 0) {
		printf("SO_Submit: Erro ao tentar receber reply do schedule.\n");
		printf("Erro: %s.\n", strerror(errno));
		exit(1);
	}
	else {
		if (schedulerReply.intMsg == OK) {
			printf("SO_Submit: PROCESSO ADICIONADO COM SUCESSO\n");
		} else if (schedulerReply.intMsg == NOT_OK) {
			printf("SO_Submit: Processo nao pode ser inserido na fila. Provaveis causas:\n\t- SO_Shutdown em acao.\n\t- O escalonador nao aceita mais entradas.\n");
		} else {
			printf("SO_Submit: Mensagem desconhecida recebida pelo SO_Schedule.\n");
		}
	}

	return 0;
}
